package com.xianyun.rpc.serverProxy;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.xianyun.rpc.model.RpcRequest;
import com.xianyun.rpc.model.RpcResponse;
import com.xianyun.rpc.serializer.impl.JdkSerializer;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.nio.file.attribute.UserPrincipal;

/**
 * JDK 动态代理生成器
 * @author xianYun
 * @version 1.0
 **/
public class ServiceProxy implements InvocationHandler {
    //可以简单理解代理对象调用方法底层其实是在调用 invoke 方法。
    //现在需要将本地调用方法的信息传递到服务提供者
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //1. 指定序列化器
        JdkSerializer serializer = new JdkSerializer();
        //2. 构建请求
        RpcRequest rpcRequest = RpcRequest.builder().serviceName(method.getDeclaringClass().getName())
                .methodName(method.getName())
                .parameterTypes(method.getParameterTypes())
                .args(args)
                .build();
        //3. 序列化请求，并发送
        try {
            byte[] rpcRequestBytes = serializer.serialize(rpcRequest);
            HttpResponse  result = HttpRequest.post("http://localhost:8080")
                    .body(rpcRequestBytes)
                    .execute();
            //4. 接收响应，并反序列化
            RpcResponse rpcResponse = serializer.deserialize(result.bodyBytes(), RpcResponse.class);
            //5. 返回结果
            return rpcResponse.getData();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
